﻿using System.Collections.Generic;
using System.Data;
using System.Linq;
using VO;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using COMMON;

namespace DAL
{
    public class CampanhaClienteDAL
    {

        private Database db;
        private DbTransaction transaction;

        #region Construtor

        public CampanhaClienteDAL()
        {
            DaoFactory objFactory = new DaoFactory(Configuracao.ConnectionString());
            transaction = objFactory.transaction;
            db = objFactory.db;
        }

        #endregion

        #region Insert
        public void Insert(CampanhaCliente obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var objC = new tbCCCampanha_Cliente();
                objC = PopulaObjeto(obj, objC);
                contexto.AddTotbCCCampanha_Cliente(objC);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Delete
        public void Delete(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                                where campanhaAux.idCampanha == idCampanha
                                select campanhaAux);
                foreach (var obj in campanha)
                {
                    contexto.DeleteObject(obj);
                }
                contexto.SaveChanges();
            }
        }

        public void Delete(int idCampanha, int idCliente)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                                where campanhaAux.idCampanha == idCampanha && campanhaAux.idCliente == idCliente
                                select campanhaAux).FirstOrDefault();
                contexto.DeleteObject(campanha);
                contexto.SaveChanges();
            }
        }
        #endregion


        #region Select


        public IList<CampanhaCliente> Select(int idCampanha, FiltroCliente obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Cliente> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                                join clienteAux in contexto.CCCliente_Callcenter on campanhaAux.idCliente equals clienteAux.idCliente
                                where campanhaAux.idCampanha == idCampanha
                                && clienteAux.CPF.Contains(obj.CPF)
                                && clienteAux.Nome.Contains(obj.Nome)
                                && (obj.UF.Contains(clienteAux.UF) || obj.UF.Count.Equals(0))
                                && (obj.Cidade.Contains(clienteAux.Cidade) || obj.Cidade.Count.Equals(0))
                                && (obj.Bairro.Contains(clienteAux.Bairro) || obj.Bairro.Count.Equals(0))
                                && clienteAux.Cep.Contains(obj.CEP)
                                && (obj.PMTDe == null || clienteAux.PMT >= obj.PMTDe) && (obj.PMTAte == null || clienteAux.PMT <= obj.PMTAte)
                                && (obj.IdadeDe == null || clienteAux.Idade >= obj.IdadeDe) && (obj.IdadeAte == null || clienteAux.Idade <= obj.IdadeAte)
                                && (obj.ScoreDe == null || clienteAux.Score >= obj.ScoreDe) && (obj.ScoreAte == null || clienteAux.Score <= obj.ScoreAte)
                                && (obj.MargemDe == null || clienteAux.Margem_Fixa >= obj.MargemDe) && (obj.MargemAte == null || clienteAux.Margem_Fixa <= obj.MargemAte)
                                && (obj.Bancos.Contains(clienteAux.Bancos) || obj.Bancos.Count.Equals(0))
                                && (obj.Convenio.Contains(clienteAux.Convenio) || obj.Convenio.Count.Equals(0))
                                && (obj.PrazoDe == null || clienteAux.Prazo >= obj.PrazoDe) && (obj.PrazoDe == null || clienteAux.Prazo <= obj.PrazoAte)
                                select new CampanhaCliente { idCampanhaCliente = campanhaAux.idCampanhaCliente, idCampanha = campanhaAux.idCampanha, idCliente = campanhaAux.idCliente, NomeCliente = clienteAux.Nome }).OrderBy(c => c.NomeCliente).ToList();

                //Carrega lista
                //var list = PopulaObjeto(campanha);
                //&& ((!obj.Idade.Equals(0) && (obj.TipoIdade.Equals(0) ? clienteAux.Idade > obj.Idade : obj.TipoIdade.Equals(1) ? clienteAux.Idade == obj.Idade : clienteAux.Idade < obj.Idade)) || obj.Idade.Equals(0))
                //&& ((obj.PMT != null && (obj.TipoPMT.Equals(0) ? clienteAux.PMT > obj.PMT : obj.TipoPMT.Equals(1) ? clienteAux.PMT == obj.PMT : clienteAux.PMT < obj.PMT)) || obj.PMT == null)
                //&& ((obj.Score != null && (obj.TipoScore.Equals(0) ? clienteAux.Score > obj.Score : obj.TipoScore.Equals(1) ? clienteAux.Score == obj.Score : clienteAux.Score < obj.Score)) || obj.Score == null)
                //&& ((obj.Margem != null && (obj.TipoMargem.Equals(0) ? clienteAux.Margem_Fixa > obj.Margem : obj.TipoMargem.Equals(1) ? clienteAux.Margem_Fixa == obj.Margem : clienteAux.Margem_Fixa < obj.Margem)) || obj.Margem == null)
                //&& ((obj.Prazo != null && (obj.TipoPrazo.Equals(0) ? clienteAux.Prazo > obj.Prazo : obj.TipoPrazo.Equals(1) ? clienteAux.Prazo == obj.Prazo : clienteAux.Prazo < obj.Prazo)) || obj.Prazo == null)
                return campanha;
            }
        }

        public IList<CampanhaCliente> Select(int idCampanha, int idCliente)
        {
            using (var contexto = new CallcenterEntities())
            {
                IQueryable<tbCCCampanha_Cliente> campanha;

                campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                            where campanhaAux.idCampanha == idCampanha && campanhaAux.idCliente == idCliente
                            select campanhaAux);

                //Carrega lista
                var list = PopulaObjeto(campanha);

                return list;
            }
        }
        #endregion

        #region CopiaCliente
        public void CopiaCliente(int idCampanha, int idCampanhaNova)
        {
            DbCommand dbCommand = db.GetStoredProcCommand("IN_ClienteCampanha");
            db.AddInParameter(dbCommand, "idCampanha", DbType.Int32, idCampanha);
            db.AddInParameter(dbCommand, "idCampanhaNova", DbType.Int32, idCampanhaNova);
            db.ExecuteNonQuery(dbCommand);
        }
        #endregion

        #region SelectClienteSemCampanha
        public IList<CampanhaCliente> SelectClienteSemCampanha(int idCampanha, string nomeCliente = "", string letra = "")
        {
            using (var contexto = new CallcenterEntities())
            {
                var cliente = (from clienteAux in contexto.CCCliente_Callcenter
                               where !(from campanhaAux in contexto.tbCCCampanha_Cliente
                                       where campanhaAux.idCampanha == idCampanha
                                       select campanhaAux.idCliente)
                                          .Contains(clienteAux.idCliente)
                                          && clienteAux.Nome != null && clienteAux.Nome != string.Empty
                                          && (clienteAux.Nome.Contains(nomeCliente) || nomeCliente == "")
                                          && (clienteAux.Nome.ToUpper().Substring(0, 1) == letra || letra == "")
                               select new CampanhaCliente { idCliente = clienteAux.idCliente, NomeCliente = clienteAux.Nome })
                               .OrderBy(c => c.NomeCliente).ToList();

                return cliente;
            }
        }
        #endregion

        #region QuantidadeClienteCampanha
        public int QuantidadeClienteCampanha(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                                where campanhaAux.idCampanha == idCampanha
                                select campanhaAux).Count();

                return campanha;
            }
        }
        #endregion


        #region clientescampanha
        public IList<CampanhaCliente> SelectClienteCampanhaDAL(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Cliente> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Cliente
                                join clienteAux in contexto.CCCliente_Callcenter on campanhaAux.idCliente equals clienteAux.idCliente
                                where campanhaAux.idCampanha == idCampanha
                                select new CampanhaCliente { idCampanhaCliente = campanhaAux.idCampanhaCliente, idCampanha = campanhaAux.idCampanha, idCliente = campanhaAux.idCliente, NomeCliente = clienteAux.Nome }).OrderBy(c => c.NomeCliente).ToList();
                return campanha;
            }
        }


        #endregion


        #region PopulaObjeto
        protected static tbCCCampanha_Cliente PopulaObjeto(CampanhaCliente obj, tbCCCampanha_Cliente tabela)
        {
            tabela.idCampanha = obj.idCampanha;
            tabela.idCliente = obj.idCliente;
            return tabela;
        }

        protected static IList<CampanhaCliente> PopulaObjeto(IQueryable<tbCCCampanha_Cliente> reader)
        {
            IList<CampanhaCliente> list = new List<CampanhaCliente>();
            foreach (var obj in reader)
            {
                var newObj = new CampanhaCliente();
                newObj.idCampanhaCliente = obj.idCampanhaCliente;
                newObj.idCampanha = obj.idCampanha;
                newObj.idCliente = obj.idCliente;
                list.Add(newObj);
            }
            return list;
        }
        #endregion

    }
}